{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n",
      "sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.2\n",
      "pandas 0.24.2\n",
      "sklearn 0.20.3\n",
      "tensorflow 2.0.0-alpha0\n",
      "tensorflow.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".. _california_housing_dataset:\n",
      "\n",
      "California Housing dataset\n",
      "--------------------------\n",
      "\n",
      "**Data Set Characteristics:**\n",
      "\n",
      "    :Number of Instances: 20640\n",
      "\n",
      "    :Number of Attributes: 8 numeric, predictive attributes and the target\n",
      "\n",
      "    :Attribute Information:\n",
      "        - MedInc        median income in block\n",
      "        - HouseAge      median house age in block\n",
      "        - AveRooms      average number of rooms\n",
      "        - AveBedrms     average number of bedrooms\n",
      "        - Population    block population\n",
      "        - AveOccup      average house occupancy\n",
      "        - Latitude      house block latitude\n",
      "        - Longitude     house block longitude\n",
      "\n",
      "    :Missing Attribute Values: None\n",
      "\n",
      "This dataset was obtained from the StatLib repository.\n",
      "http://lib.stat.cmu.edu/datasets/\n",
      "\n",
      "The target variable is the median house value for California districts.\n",
      "\n",
      "This dataset was derived from the 1990 U.S. census, using one row per census\n",
      "block group. A block group is the smallest geographical unit for which the U.S.\n",
      "Census Bureau publishes sample data (a block group typically has a population\n",
      "of 600 to 3,000 people).\n",
      "\n",
      "It can be downloaded/loaded using the\n",
      ":func:`sklearn.datasets.fetch_california_housing` function.\n",
      "\n",
      ".. topic:: References\n",
      "\n",
      "    - Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions,\n",
      "      Statistics and Probability Letters, 33 (1997) 291-297\n",
      "\n",
      "(20640, 8)\n",
      "(20640,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import fetch_california_housing\n",
    "\n",
    "housing = fetch_california_housing()\n",
    "print(housing.DESCR)\n",
    "print(housing.data.shape)\n",
    "print(housing.target.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(11610, 8) (11610,)\n",
      "(3870, 8) (3870,)\n",
      "(5160, 8) (5160,)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "x_train_all, x_test, y_train_all, y_test = train_test_split(\n",
    "    housing.data, housing.target, random_state = 7)\n",
    "x_train, x_valid, y_train, y_valid = train_test_split(\n",
    "    x_train_all, y_train_all, random_state = 11)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_test.shape, y_test.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "x_train_scaled = scaler.fit_transform(x_train)\n",
    "x_valid_scaled = scaler.transform(x_valid)\n",
    "x_test_scaled = scaler.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_4 (InputLayer)            [(None, 6)]          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "dense_3 (Dense)                 (None, 30)           210         input_4[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "input_3 (InputLayer)            [(None, 5)]          0                                            \n",
      "__________________________________________________________________________________________________\n",
      "dense_4 (Dense)                 (None, 30)           930         dense_3[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_1 (Concatenate)     (None, 35)           0           input_3[0][0]                    \n",
      "                                                                 dense_4[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dense_5 (Dense)                 (None, 1)            36          concatenate_1[0][0]              \n",
      "==================================================================================================\n",
      "Total params: 1,176\n",
      "Trainable params: 1,176\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# 多输入\n",
    "input_wide = keras.layers.Input(shape=[5])\n",
    "input_deep = keras.layers.Input(shape=[6])\n",
    "hidden1 = keras.layers.Dense(30, activation='relu')(input_deep)\n",
    "hidden2 = keras.layers.Dense(30, activation='relu')(hidden1)\n",
    "concat = keras.layers.concatenate([input_wide, hidden2])\n",
    "output = keras.layers.Dense(1)(concat)\n",
    "model = keras.models.Model(inputs = [input_wide, input_deep],\n",
    "                           outputs = [output])\n",
    "        \n",
    "\n",
    "model.compile(loss=\"mean_squared_error\", optimizer=\"sgd\")\n",
    "callbacks = [keras.callbacks.EarlyStopping(\n",
    "    patience=5, min_delta=1e-2)]\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 11610 samples, validate on 3870 samples\n",
      "Epoch 1/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.8562 - val_loss: 0.7680\n",
      "Epoch 2/100\n",
      "11610/11610 [==============================] - 1s 85us/sample - loss: 0.6594 - val_loss: 0.6690\n",
      "Epoch 3/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.6023 - val_loss: 0.6326\n",
      "Epoch 4/100\n",
      "11610/11610 [==============================] - 1s 83us/sample - loss: 0.5751 - val_loss: 0.6092\n",
      "Epoch 5/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.5567 - val_loss: 0.6005\n",
      "Epoch 6/100\n",
      "11610/11610 [==============================] - 1s 85us/sample - loss: 0.5434 - val_loss: 0.5771\n",
      "Epoch 7/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.5317 - val_loss: 0.5632\n",
      "Epoch 8/100\n",
      "11610/11610 [==============================] - 1s 81us/sample - loss: 0.5233 - val_loss: 0.5539\n",
      "Epoch 9/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.5153 - val_loss: 0.5531\n",
      "Epoch 10/100\n",
      "11610/11610 [==============================] - 1s 81us/sample - loss: 0.5069 - val_loss: 0.5360\n",
      "Epoch 11/100\n",
      "11610/11610 [==============================] - 1s 81us/sample - loss: 0.5015 - val_loss: 0.5289\n",
      "Epoch 12/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.4958 - val_loss: 0.5395\n",
      "Epoch 13/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.4907 - val_loss: 0.5196\n",
      "Epoch 14/100\n",
      "11610/11610 [==============================] - 1s 83us/sample - loss: 0.4855 - val_loss: 0.5120\n",
      "Epoch 15/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.4820 - val_loss: 0.5149\n",
      "Epoch 16/100\n",
      "11610/11610 [==============================] - 1s 89us/sample - loss: 0.4769 - val_loss: 0.5100\n",
      "Epoch 17/100\n",
      "11610/11610 [==============================] - 1s 90us/sample - loss: 0.4728 - val_loss: 0.5056\n",
      "Epoch 18/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.4683 - val_loss: 0.4995\n",
      "Epoch 19/100\n",
      "11610/11610 [==============================] - 1s 80us/sample - loss: 0.4662 - val_loss: 0.4932\n",
      "Epoch 20/100\n",
      "11610/11610 [==============================] - 1s 83us/sample - loss: 0.4625 - val_loss: 0.4938\n",
      "Epoch 21/100\n",
      "11610/11610 [==============================] - 1s 80us/sample - loss: 0.4585 - val_loss: 0.4835\n",
      "Epoch 22/100\n",
      "11610/11610 [==============================] - 1s 80us/sample - loss: 0.4552 - val_loss: 0.4817\n",
      "Epoch 23/100\n",
      "11610/11610 [==============================] - 1s 81us/sample - loss: 0.4525 - val_loss: 0.4766\n",
      "Epoch 24/100\n",
      "11610/11610 [==============================] - 1s 81us/sample - loss: 0.4509 - val_loss: 0.4752\n",
      "Epoch 25/100\n",
      "11610/11610 [==============================] - 1s 84us/sample - loss: 0.4460 - val_loss: 0.4701\n",
      "Epoch 26/100\n",
      "11610/11610 [==============================] - 1s 88us/sample - loss: 0.4437 - val_loss: 0.4683\n",
      "Epoch 27/100\n",
      "11610/11610 [==============================] - 1s 88us/sample - loss: 0.4407 - val_loss: 0.4710\n",
      "Epoch 28/100\n",
      "11610/11610 [==============================] - 1s 86us/sample - loss: 0.4376 - val_loss: 0.4597\n",
      "Epoch 29/100\n",
      "11610/11610 [==============================] - 1s 85us/sample - loss: 0.4359 - val_loss: 0.4583\n",
      "Epoch 30/100\n",
      "11610/11610 [==============================] - 1s 86us/sample - loss: 0.4337 - val_loss: 0.4565\n",
      "Epoch 31/100\n",
      "11610/11610 [==============================] - 1s 85us/sample - loss: 0.4312 - val_loss: 0.4544\n",
      "Epoch 32/100\n",
      "11610/11610 [==============================] - 1s 83us/sample - loss: 0.4294 - val_loss: 0.4523\n",
      "Epoch 33/100\n",
      "11610/11610 [==============================] - 1s 85us/sample - loss: 0.4276 - val_loss: 0.4509\n"
     ]
    }
   ],
   "source": [
    "x_train_scaled_wide = x_train_scaled[:, :5]\n",
    "x_train_scaled_deep = x_train_scaled[:, 2:]\n",
    "x_valid_scaled_wide = x_valid_scaled[:, :5]\n",
    "x_valid_scaled_deep = x_valid_scaled[:, 2:]\n",
    "x_test_scaled_wide = x_test_scaled[:, :5]\n",
    "x_test_scaled_deep = x_test_scaled[:, 2:]\n",
    "\n",
    "history = model.fit([x_train_scaled_wide, x_train_scaled_deep],\n",
    "                    y_train,\n",
    "                    validation_data = (\n",
    "                        [x_valid_scaled_wide, x_valid_scaled_deep],\n",
    "                        y_valid),\n",
    "                    epochs = 100,\n",
    "                    callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAEzCAYAAAALosttAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XmYVNWB/vHvqb33bnpjaXYQZBNQMIgiqHFNXBITY9SomWgmiYmZzPgbs5mMk92ZyWyOy0xMNGNimIwxGonGSWgXNIggi4CsitAsDQ29d/VSfX5/3Nvd1d0FFFJ03e56P89zn6q693TV6UM9vH3POfdcY61FREREvMOX7gqIiIhIbwpnERERj1E4i4iIeIzCWURExGMUziIiIh6jcBYREfGY44azMeYRY0y1Meatoxw3xph/NcZsN8asN8bMTX01RUREMkcyZ84/Ay49xvHLgMnudjvwwMlXS0REJHMdN5yttS8Bh49R5CrgMev4M1BojBmRqgqKiIhkmlSMOY8Cdse93uPuExERkfchMJAfZoy5Hafrm0gkcuaYMWMG8uMHhc7OTnw+zdPrS+3Sn9okMbVLYmqXxAayXbZu3XrIWluaTNlUhHMVMDrudYW7rx9r7cPAwwBTpkyxW7ZsScHHDy2VlZUsXrw43dXwHLVLf2qTxNQuialdEhvIdjHG7Eq2bCr+XHga+JQ7a/sDQJ21dl8K3ldERCQjHffM2RjzS2AxUGKM2QN8CwgCWGsfBJYBlwPbgWbg1lNVWRERkUxw3HC21l5/nOMW+ELKaiQiIpLhBnRCmIiIDF7t7e3s2bOHaDSa7qqkTEFBAZs3b07pe0YiESoqKggGg+/7PRTOIiKSlD179pCXl8e4ceMwxqS7OinR0NBAXl5eyt7PWktNTQ179uxh/Pjx7/t9NK9eRESSEo1GKS4uHjLBfCoYYyguLj7p3gWFs4iIJE3BfHypaCOFs4iIDBq5ubnprsKAUDiLiIh4jMJZREQGHWstd911FzNmzGDmzJn86le/AmDfvn0sWrSI2bNnM2PGDF5++WVisRi33HJLd9kf//jHaa798Wm2toiIDDpPPvkka9euZd26dRw6dIh58+axaNEifvGLX3DJJZfw9a9/nVgsRnNzM2vXrqWqqoq33noLgNra2jTX/vgUziIicsL+7pmNbNpbn9L3nDYyn299eHpSZV955RWuv/56/H4/5eXlnH/++axatYp58+bx6U9/mvb2dq6++mpmz57NhAkT2LlzJ1/84he54ooruPjii1Na71NB3doiIjJkLFq0iJdeeolRo0Zxyy238Nhjj1FUVMS6detYvHgxDz74IJ/5zGfSXc3j0pmziIicsGTPcE+V8847j4ceeoibb76Zw4cP89JLL3Hfffexa9cuKioquO2222htbWXNmjVcfvnlhEIhPvrRjzJlyhRuvPHGtNY9GQpnEREZdK655hpee+01zjjjDIwx/OhHP2L48OE8+uij3HfffQSDQXJzc3nssceoqqri1ltvpbOzE4Dvf//7aa798SmcRURk0GhsbASchT7uu+8+7rvvvl7Hb775Zm6++eZ+P7dmzZoBqV+qaMxZRETEYxTOIiIiHqNwFhER8RiFs4iIiMconEVERDxG4SwiIuIxCmcRERGPUTiLiMiQdaz7P7/77rucffbZA1ib5CmcRUREPEbhLCIig8bdd9/N/fff3/3629/+Nt/5zne48MILmTt3LjNnzuS3v/3tCb9vNBrl1ltvZebMmcyZM4fly5cDsHHjRubPn8/s2bOZNWsW27Zto6mpiSuuuIIzzjiDGTNmdN9LOpW0fKeIiJy4398N+zek9j2Hz4TLfnDMItdddx1f/vKX+cIXvgDA0qVLef755/nSl75Efn4+hw4d4gMf+ABXXnklxpikP/r+++/HGMOGDRt4++23ufjii9m6dSsPPvggd955JzfccANtbW3EYjGWLVvGyJEjefbZZwGoq6t7/7/zUejMWUREBo05c+ZQXV3N3r17WbduHUVFRQwfPpyvfe1rzJo1i4suuoiqqioOHDhwQu/7yiuvdN+taurUqYwdO5atW7eyYMECvve97/HDH/6QXbt2kZWVxcyZM3nhhRf427/9W15++WUKCgpS/nvqzFlERE7ccc5wT6WPfexj/PrXv2b//v1cd911PP744xw8eJDVq1cTDAYZN24c0Wg0JZ/1yU9+krPPPptnn32Wyy+/nIceeogLLriANWvWsGzZMr7xjW9w4YUXcs8996Tk87oonEVEZFC57rrruO222zh06BAvvvgiS5cupaysjGAwyPLly9m1a9cJv+d5553H448/zgUXXMDWrVt57733mDJlCjt37mTChAl86Utf4r33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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 1)\n",
    "    plt.show()\n",
    "plot_learning_curves(history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5160/5160 [==============================] - 0s 45us/sample - loss: 0.43840s - loss: 0.440\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.4383709618287493"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate([x_test_scaled_wide, x_test_scaled_deep], y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
